package mall.kotlin.com.myapplication.view;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Scroller;

/**
 * USER: zjw
 * DATA: 2018/10/31 0031
 * TIME: 上午 9:24
 */
public class CustomView extends View {
    Scroller mScroller;

    public CustomView(Context context) {
        super(context);
        init(context);
    }

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);

    }

    private void init(Context context) {
        mScroller = new Scroller(context);
    }

    int lastX;
    int lastY;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int x = (int) event.getX();
        int y = (int) event.getY();
        Log.i("onTouchEvent", "x-->" + x + "   y-->" + y);
        Log.i("onTouchEvent", "getLeft" + getLeft() + "   getTop-->" + getTop() + "   getRight-->" + getRight() + "   getBottom-->" + getBottom());

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                lastX = x;
                lastY = y;
                break;
            case MotionEvent.ACTION_MOVE:
                int offsetX = x - lastX;
                int offsety = y - lastY;

                //第一种方式用layout重新排版布局,来改变view位置
                //layout(getLeft() + offsetX, getTop() + offsety, getRight() + offsetX, getBottom() + offsety);

                // 第二种offsetLeftAndRight(offsetX)   offsetTopAndBottom(offsetY)
                //offsetLeftAndRight(offsetX);
                //offsetTopAndBottom(offsety);

                //第三种  layoutParams
//                ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();
                LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams();
                layoutParams.leftMargin = getLeft() + offsetX;
                layoutParams.topMargin = getTop() + offsety;
                setLayoutParams(layoutParams);

                //第四种 scollBy(x,y)  scollTo(x,y) 都是瞬间变化的
                //scollBy 最终环视条用的scollTo  画布没有动,如果是正值,相当手机屏幕想右或向下,移动,view在画布上的位置并没有变,但是看到的效果就是相反的,所有要是只为负值,看到的效果就是我们想要的效果
//                ((View) getParent()).scrollBy(-50, -50);

                //第五种 scroller
                break;
        }
        return true;
    }

    /**
     * 系统会在view绘制ondraw()中调用这个方法,我们调用父类的scrollTo()方法并通过scroller来不断的获取当前的滚动值
     * ,没滑动一段我们就调用invalidate()不断的重绘,重绘就会调用computeScroll()
     */
    @Override
    public void computeScroll() {
        super.computeScroll();
        //当前正在移动的时候返回true
        if (mScroller.computeScrollOffset()) {
            ((View) getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            invalidate();//重绘
        }
    }
    //直接调用 smoothScrollTo(-400,0)

    public void smoothScrollTo(int x, int y) {
        int sx = getScrollX();
        int delta = x - sx;
        mScroller.startScroll(sx, 0, delta, 200);
        invalidate();
    }
}
